# 给定一个包含大写字母和小写字母的字符串，找到通过这些字母构造成的最长的回文串。

# 在构造过程中，请注意区分大小写。比如 "Aa" 不能当做一个回文字符串。

# 注意:
# 假设字符串的长度不会超过 1010。

# 示例 1:

# 输入:
# "abccccdd"

# 输出:
# 7

# 解释:
# 我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。

class Solution:
    def longestPalindrome(self, s):
        """
        :type s: str
        :rtype: int
        """
        # 使用动态规划，用空间换时间，把问题拆分
        # 获取字符串s的长度
        str_length = len(s)
        # 记录最大字符串长度
        max_length = 0
        # 记录位置
        start = 0
        # 循环遍历字符串的每一个字符
        for i in range(str_length):
            # 如果当前循环次数-当前最大长度大于等于1  并  字符串[当前循环次数-当前最大长度-1:当前循环次数+1]  == 取反后字符串
            if i - max_length >= 1 and s[i-max_length-1: i+1] == s[i-max_length-1: i+1][::-1]:
                # 记录当前开始位置
                start = i - max_length - 1
                # 取字符串最小长度为2，所以+=2，s[i-max_length-1: i+1]
                max_length += 2
                continue
            # 如果当前循环次数-当前最大长度大于等于0  并  字符串[当前循环次数-当前最大长度:当前循环次数+1]  == 取反后字符串
            if i - max_length >= 0 and s[i-max_length: i+1] == s[i-max_length: i+1][::-1]:
                start = i - max_length
                # 取字符串最小长度为1，所以+=1，s[i-max_length: i+1]
                max_length += 1
        # 返回最长回文子串
        # return s[start: start + max_length]
        return max_length